import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';
import { Logger } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { HealthCheckService } from '@app/health';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);
  const logger = new Logger('Bootstrap');

  // 🔍 启动前检查所有外部服务连接
  logger.log("🔗 开始连接检查...");
  const healthCheckService = app.get(HealthCheckService);
  const allConnectionsHealthy = await healthCheckService.checkAllConnections();

  if (!allConnectionsHealthy) {
    logger.error("💥 外部服务连接失败，应用启动中止！");
    logger.error("请检查以下服务配置和可用性：");
    logger.error("1. 数据库服务是否启动并可访问");
    logger.error("2. Redis服务是否启动并可访问");
    logger.error("3. 网络连接是否正常");
    logger.error("4. 配置文件中的连接参数是否正确");

    // 关闭应用
    await app.close();
    process.exit(1);
  }

  // 配置 CORS
  app.enableCors({
    origin: true,
    credentials: true,
  });
  // 设置全局前缀（去除首尾斜杠，避免出现双斜杠）
  const globalPrefixRaw = configService.get<string>('GLOBAL_PREFIX', '/api');
  const normalizedPrefix = (globalPrefixRaw || '').replace(/^\/+|\/+$/g, '');
  if (normalizedPrefix) {
    app.setGlobalPrefix(normalizedPrefix);
  }

  // 配置 Swagger
  const config = new DocumentBuilder()
    .setTitle(configService.get('APP_NAME', 'KanliAdmin'))
    .setDescription('KV博客管理后台API文档')
    .setVersion('1.0')
    .addBearerAuth()
    .addTag('认证', '用户认证相关接口')
    .addTag('用户管理', '用户管理相关接口')
    .addTag('文章管理', '文章管理相关接口')
    .addTag('标签管理', '标签管理相关接口')
    .addTag('分类管理', '分类管理相关接口')
    .addTag('公告管理', '公告管理相关接口')
    .addTag('文件上传', '文件上传相关接口')
    .addTag('系统管理', '系统管理相关接口')
    .addTag('仪表板', '仪表板相关接口')
    .build();

  const document = SwaggerModule.createDocument(app, config);
  const swaggerPath = normalizedPrefix ? `/${normalizedPrefix}/docs` : '/docs';
  SwaggerModule.setup(swaggerPath, app, document, {
    swaggerOptions: {
      persistAuthorization: true,
    },
  });

  // 暴露原始 Swagger JSON（不经过全局拦截器包装）
  const swaggerJsonPath = normalizedPrefix ? `/${normalizedPrefix}/docs-json` : '/docs-json';
  const httpAdapter = app.getHttpAdapter();
  httpAdapter.get(swaggerJsonPath, (req, res) => {
    res.setHeader('Content-Type', 'application/json');
    res.send(JSON.stringify(document));
  });

  const port = configService.get('ADMIN_APP_PORT', 7000);
  await app.listen(port);

  const appName = configService.get('APP_NAME', 'KanliAdmin');
  const basePath = normalizedPrefix ? `/${normalizedPrefix}` : '';
  logger.log(`🚀 ${appName} is running on: http://localhost:${port}${basePath}`);
  logger.log(`📚 API Documentation: http://localhost:${port}${basePath}/docs`);
  logger.log(`💊 Health Check: http://localhost:${port}${basePath}/health`);
}

bootstrap();